#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdbool.h>
#include <unistd.h>
#include "tools.h"
#include "msg.h"

//菜单
void cilent_menu(void);
//开户
void cilent_open(void);
//销户
void cilent_close(void);
//登入
void cilent_enter(void);
//解锁
void cilent_unlock(void);

//定义一个消息队列结构体
Msg msg;

int main()
{
	msg.pid = getpid();
	init_msg(110);
	while(true)
	{
		clear_src();
		cilent_menu();
		switch(get_cmd('1', '5'))
		{
			case '1': cilent_open(); break;
			case '2': cilent_close(); break;
			case '3': cilent_enter(); break;
			case '4': cilent_unlock(); break;
			case '5': return 0;	
		}
	}
}

//菜单
void cilent_menu(void)
{
	clear_src();
	puts("******指针ATM******");
	puts("1、开户");
	puts("2、销户");
	puts("3、登入");
	puts("4、解锁");
	puts("5、退出");
	puts("--------------------");
}

//开户
void cilent_open(void)
{
	puts("***开户***");
	printf("姓名：");
	get_str(msg.cil.name, 20);
	printf("身份证：");
	get_str(msg.cil.ID, 20);
	printf("密码：");
	get_passwd(msg.cil.pass, true, 20);
	printf("预存金额：");
	scanf("%d", &msg.cil.money);
	clear_stdin();
	msg.cil.error_cnt = 0;

	msg.type = open_type;
	msg_snd(&msg);
	
	msg_rcv(&msg, msg.pid);
	printf("开户成功,帐号:%s\n", msg.cil.acc);
	anykey_continue();
}
//销户
void cilent_close(void)
{
	puts("***销户***");
	printf("帐号：");
	get_str(msg.cil.acc, 20);
	printf("密码：");
	get_passwd(msg.cil.pass, true, 20);
	
	msg.type = close_type;
	msg_snd(&msg);

	int flag = rcv_flag(msg.pid);
	if(1 == flag)
	{
		puts("是否确认销户(1.yes 0.no):");
		char cmd = get_cmd('0', '1');

		snd_flag(msg.pid, cmd-'0');

		cmd == '1' && puts("***销户成功!***");
	}
	else
	{
		puts("***用户名或密码错误!***");
	}
	anykey_continue();
}

//存钱
void cilent_save(void)
{
	int temp_money = 0;
	printf("存入金额：");
	scanf("%d", &temp_money);
	clear_stdin();
	msg.cil.money += temp_money;
	puts("***存入成功！***");
	anykey_continue();
}

//取钱
void cilent_take(void)
{
	int temp_money = 0;
	printf("取出金额：");
	scanf("%d", &temp_money);
	clear_stdin();
	if(temp_money > msg.cil.money)
	{
		puts("***余额不足,取出失败!***");
		anykey_continue();
		return;
	}
	msg.cil.money -= temp_money;
	puts("***取款成功!***");
	anykey_continue();
}

//转帐
void cilent_transfer(void)
{
	Msg msg_tra;
	printf("转帐ID:");
	get_str(msg_tra.cil.acc, 20);
	printf("转帐金额:");
	scanf("%d", &msg_tra.cil.money);
	clear_stdin();	
	if(msg_tra.cil.money > msg.cil.money)
	{
		puts("***余额不足，转帐失败！***");
		anykey_continue();
		return;
	}		
	msg.cil.money -= msg_tra.cil.money;
	msg_tra.type = transfer_type;
	msg_tra.pid = msg.pid;
	msg_snd(&msg_tra);
	rcv_flag(msg.pid) ? puts("***转帐成功!***") : puts("***账户不存在，转帐失败!***");
	anykey_continue();
}

//查询
void cilent_query(void)
{
	printf("账户余额：%d\n", msg.cil.money);
	anykey_continue();
}

//改密
void cilent_change(void)
{
	char temp_pass[20] = {};
	printf("原密码：");
	get_passwd(temp_pass, true, 20);
	if(strcmp(temp_pass, msg.cil.pass))
	{
		puts("***密码错误，修改失败!***");
		anykey_continue();
		return;
	}
	printf("新密码：");
	get_passwd(msg.cil.pass, true, 20);
	puts("***修改成功!***");
	anykey_continue();
}

//登入成功菜单
void success_enter_menu(void)
{
	clear_src();
	printf("***%s***\n", msg.cil.name);
	puts("1、存钱");
	puts("2、取钱");
	puts("3、转帐");
	puts("4、查询");
	puts("5、改密");
	puts("6、退出");
	puts("--------------------");
}

void cilent_success_enter(void)
{
	while(true)
	{
		success_enter_menu();
		switch(get_cmd('1', '6'))
		{
			case '1': cilent_save(); break;
			case '2': cilent_take(); break;
			case '3': cilent_transfer(); break;
			case '4': cilent_query(); break;
			case '5': cilent_change(); break;
			case '6': msg.type = save_type;
					  msg_snd(&msg);
					  return;	
		}
	}
}

//登入
void cilent_enter(void)
{
	puts("***登入***");
	printf("帐号：");
	get_str(msg.cil.acc, 20);
	printf("密码：");
	get_passwd(msg.cil.pass, true, 20);

	msg.type = enter_type;
	msg_snd(&msg);

	int flag = rcv_flag(msg.pid);
	if(1 == flag)
	{
		msg_rcv(&msg, msg.pid);
		cilent_success_enter();
	}
	else if(2 == flag)
	{
		puts("密码错误3次,已被锁");
		anykey_continue();
	}
	else
	{
		puts("帐号或密码错误");
		anykey_continue();
	}
}

//解锁
void cilent_unlock(void)
{
	puts("***解锁***");
	printf("帐号：");
	get_str(msg.cil.acc, 20);
	printf("身份证：");
	get_str(msg.cil.ID, 20);

	msg.type = unlock_type;
	msg_snd(&msg);

	int flag = rcv_flag(msg.pid);
	1 == flag ? puts("***解锁成功!***") : puts("***身份证或密码错误，解锁失败!***");
	anykey_continue();
}
